로딩 중이에요... 🐣
10 포스트 생성 API 유닛 테스트 | ✅ 편저: 코담 운영자
10강 - 포스트 생성 API 유닛 테스트 (GET 요청)
테스트 - 포스트 생성 API, GET 요청✨ 이번 강의 목표
post_create
API의 동작을 유닛 테스트로 검증- 로그인 유무에 따른 분기 처리 테스트
- 테스트 전용
TestCase
작성법 익히기 - reverse(), status_code, assertTemplateUsed 등 사용법 숙지
1. 테스트 작성 개요
Django는 HTTP 요청/응답을 테스트할 수 있는 강력한 테스트 프레임워크를 제공합니다. 이번 강의에서는 GET 요청에 대한 포스트 생성 뷰의 동작을 테스트합니다.
- 인증된 사용자 → 정상적으로 템플릿 반환되는지
- 인증되지 않은 사용자 → 로그인 페이지로 리디렉트되는지
2. 테스트 코드 작성
✅ 테스트 목적
- 뷰 함수
post_create
에 GET 요청을 보냈을 때,- 로그인한 사용자는 정상적으로 페이지를 열람할 수 있어야 함
- 로그인하지 않은 사용자는 로그인 페이지로 리디렉션되어야 함
- 템플릿이 올바르게 렌더링되는지 확인
- URL 네임스페이스 오류 없이 정상 동작 확인
✅ 테스트 코드 위치
tests/views/test_post_create.py
파일에 작성합니다.
※ tests
폴더는 앱 내부에 위치시키고, 파일명은 기능별로 분리하는 것이 좋습니다.
tests/views/test_post_create.py
from django.test import TestCase
from django.urls import reverse
from django.contrib.auth import get_user_model
class PostCreateViewTest(TestCase):
"""
Post 생성 뷰에 대한 GET 요청 유닛 테스트 클래스입니다.
- 로그인된 사용자는 post_create 페이지 접근 가능
- 로그인되지 않은 사용자는 로그인 페이지로 이동
"""
def setUp(self):
"""
테스트마다 실행되는 초기 설정 메서드입니다.
테스트용 유저를 생성하여 인증 테스트에 활용합니다.
"""
self.user = get_user_model().objects.create_user(
username='testuser',
email='test@example.com',
password='testpass123'
)
def test_get_create_authenticated_user(self):
"""
로그인된 사용자가 post_create 뷰에 GET 요청을 보냈을 때
- HTTP 200 상태 코드 반환
- 'posts/post_create.html' 템플릿 사용 확인
"""
# 로그인 처리
self.client.login(username='testuser', password='testpass123')
# reverse()로 URL을 가져옴
response = self.client.get(reverse('posts:post_create'))
# 상태 코드 200 반환 확인
self.assertEqual(response.status_code, 200)
# 템플릿 사용 확인
self.assertTemplateUsed(response, 'posts/post_create.html')
def test_get_create_unauthenticated_user(self):
"""
로그인하지 않은 사용자가 post_create에 접근했을 때
- 리디렉트 발생 (HTTP 302)
- 리디렉트 경로에 로그인 URL 포함 확인
"""
# 로그인하지 않은 상태에서 접근
response = self.client.get(reverse('posts:post_create'))
# 로그인 페이지로 리디렉트되는지 확인
self.assertEqual(response.status_code, 302)
self.assertIn('/users/login', response.url)
3. 테스트 설명
각 테스트는 Django의 TestCase 기능을 기반으로 동작하며, 다음과 같은 구조로 되어 있습니다:
-
setUp()
: 공통 유저 생성 (테스트 환경 초기화) -
client.get()
: 실제 GET 요청 시뮬레이션 -
reverse()
함수: URL 문자열 하드코딩 방지 -
assertEqual()
: 응답 상태 코드 검증 -
assertTemplateUsed()
: HTML 템플릿 사용 여부 검증 -
assertIn()
: 리디렉트된 URL 확인 -
setUp()
메서드는 테스트마다 실행되는 초기 설정입니다. -
self.client.get(...)
을 통해 실제로 HTTP 요청을 보냅니다. -
reverse('posts:post_create')
는 하드코딩된 URL 대신 사용해 유지보수에 유리합니다. -
assertEqual(response.status_code, 200)
: 정상 페이지 반환 -
assertTemplateUsed(...)
: 지정 템플릿이 사용되었는지 확인 -
인증되지 않은 경우에는
302
(리디렉트) 코드와 로그인 URL 포함 확인
✅ 정리
- 유닛 테스트로
post_create
뷰의 GET 요청 처리를 검증 - 로그인된 사용자는 폼 페이지 반환, 미로그인 사용자는 리디렉트 확인
- reverse(), assertEqual(), assertTemplateUsed() 등을 통해 안정성 있는 테스트 작성
👉 다음 강의에서는 POST 요청 테스트와 실제 이미지 업로드 테스트를 다룹니다.